home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / include / linux / kobject.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  6.8 KB  |  227 lines

  1. /*
  2.  * kobject.h - generic kernel object infrastructure.
  3.  *
  4.  * Copyright (c) 2002-2003 Patrick Mochel
  5.  * Copyright (c) 2002-2003 Open Source Development Labs
  6.  * Copyright (c) 2006-2008 Greg Kroah-Hartman <greg@kroah.com>
  7.  * Copyright (c) 2006-2008 Novell Inc.
  8.  *
  9.  * This file is released under the GPLv2.
  10.  *
  11.  * Please read Documentation/kobject.txt before using the kobject
  12.  * interface, ESPECIALLY the parts about reference counts and object
  13.  * destructors.
  14.  */
  15.  
  16. #ifndef _KOBJECT_H_
  17. #define _KOBJECT_H_
  18.  
  19. #include <linux/types.h>
  20. #include <linux/list.h>
  21. #include <linux/sysfs.h>
  22. #include <linux/compiler.h>
  23. #include <linux/spinlock.h>
  24. #include <linux/kref.h>
  25. #include <linux/kernel.h>
  26. #include <linux/wait.h>
  27. #include <asm/atomic.h>
  28.  
  29. #define UEVENT_HELPER_PATH_LEN        256
  30. #define UEVENT_NUM_ENVP            32    /* number of env pointers */
  31. #define UEVENT_BUFFER_SIZE        2048    /* buffer for the variables */
  32.  
  33. /* path to the userspace helper executed on an event */
  34. extern char uevent_helper[];
  35.  
  36. /* counter to tag the uevent, read only except for the kobject core */
  37. extern u64 uevent_seqnum;
  38.  
  39. /*
  40.  * The actions here must match the index to the string array
  41.  * in lib/kobject_uevent.c
  42.  *
  43.  * Do not add new actions here without checking with the driver-core
  44.  * maintainers. Action strings are not meant to express subsystem
  45.  * or device specific properties. In most cases you want to send a
  46.  * kobject_uevent_env(kobj, KOBJ_CHANGE, env) with additional event
  47.  * specific variables added to the event environment.
  48.  */
  49. enum kobject_action {
  50.     KOBJ_ADD,
  51.     KOBJ_REMOVE,
  52.     KOBJ_CHANGE,
  53.     KOBJ_MOVE,
  54.     KOBJ_ONLINE,
  55.     KOBJ_OFFLINE,
  56.     KOBJ_MAX
  57. };
  58.  
  59. struct kobject {
  60.     const char        *name;
  61.     struct list_head    entry;
  62.     struct kobject        *parent;
  63.     struct kset        *kset;
  64.     struct kobj_type    *ktype;
  65.     struct sysfs_dirent    *sd;
  66.     struct kref        kref;
  67.     unsigned int state_initialized:1;
  68.     unsigned int state_in_sysfs:1;
  69.     unsigned int state_add_uevent_sent:1;
  70.     unsigned int state_remove_uevent_sent:1;
  71. };
  72.  
  73. extern int kobject_set_name(struct kobject *kobj, const char *name, ...)
  74.                 __attribute__((format(printf, 2, 3)));
  75.  
  76. static inline const char *kobject_name(const struct kobject *kobj)
  77. {
  78.     return kobj->name;
  79. }
  80.  
  81. extern void kobject_init(struct kobject *kobj, struct kobj_type *ktype);
  82. extern int __must_check kobject_add(struct kobject *kobj,
  83.                     struct kobject *parent,
  84.                     const char *fmt, ...);
  85. extern int __must_check kobject_init_and_add(struct kobject *kobj,
  86.                          struct kobj_type *ktype,
  87.                          struct kobject *parent,
  88.                          const char *fmt, ...);
  89.  
  90. extern void kobject_del(struct kobject *kobj);
  91.  
  92. extern struct kobject * __must_check kobject_create(void);
  93. extern struct kobject * __must_check kobject_create_and_add(const char *name,
  94.                         struct kobject *parent);
  95.  
  96. extern int __must_check kobject_rename(struct kobject *, const char *new_name);
  97. extern int __must_check kobject_move(struct kobject *, struct kobject *);
  98.  
  99. extern struct kobject *kobject_get(struct kobject *kobj);
  100. extern void kobject_put(struct kobject *kobj);
  101.  
  102. extern char *kobject_get_path(struct kobject *kobj, gfp_t flag);
  103.  
  104. struct kobj_type {
  105.     void (*release)(struct kobject *kobj);
  106.     struct sysfs_ops *sysfs_ops;
  107.     struct attribute **default_attrs;
  108. };
  109.  
  110. struct kobj_uevent_env {
  111.     char *envp[UEVENT_NUM_ENVP];
  112.     int envp_idx;
  113.     char buf[UEVENT_BUFFER_SIZE];
  114.     int buflen;
  115. };
  116.  
  117. struct kset_uevent_ops {
  118.     int (*filter)(struct kset *kset, struct kobject *kobj);
  119.     const char *(*name)(struct kset *kset, struct kobject *kobj);
  120.     int (*uevent)(struct kset *kset, struct kobject *kobj,
  121.               struct kobj_uevent_env *env);
  122. };
  123.  
  124. struct kobj_attribute {
  125.     struct attribute attr;
  126.     ssize_t (*show)(struct kobject *kobj, struct kobj_attribute *attr,
  127.             char *buf);
  128.     ssize_t (*store)(struct kobject *kobj, struct kobj_attribute *attr,
  129.              const char *buf, size_t count);
  130. };
  131.  
  132. extern struct sysfs_ops kobj_sysfs_ops;
  133.  
  134. /**
  135.  * struct kset - a set of kobjects of a specific type, belonging to a specific subsystem.
  136.  *
  137.  * A kset defines a group of kobjects.  They can be individually
  138.  * different "types" but overall these kobjects all want to be grouped
  139.  * together and operated on in the same manner.  ksets are used to
  140.  * define the attribute callbacks and other common events that happen to
  141.  * a kobject.
  142.  *
  143.  * @list: the list of all kobjects for this kset
  144.  * @list_lock: a lock for iterating over the kobjects
  145.  * @kobj: the embedded kobject for this kset (recursion, isn't it fun...)
  146.  * @uevent_ops: the set of uevent operations for this kset.  These are
  147.  * called whenever a kobject has something happen to it so that the kset
  148.  * can add new environment variables, or filter out the uevents if so
  149.  * desired.
  150.  */
  151. struct kset {
  152.     struct list_head list;
  153.     spinlock_t list_lock;
  154.     struct kobject kobj;
  155.     struct kset_uevent_ops *uevent_ops;
  156. };
  157.  
  158. extern void kset_init(struct kset *kset);
  159. extern int __must_check kset_register(struct kset *kset);
  160. extern void kset_unregister(struct kset *kset);
  161. extern struct kset * __must_check kset_create_and_add(const char *name,
  162.                         struct kset_uevent_ops *u,
  163.                         struct kobject *parent_kobj);
  164.  
  165. static inline struct kset *to_kset(struct kobject *kobj)
  166. {
  167.     return kobj ? container_of(kobj, struct kset, kobj) : NULL;
  168. }
  169.  
  170. static inline struct kset *kset_get(struct kset *k)
  171. {
  172.     return k ? to_kset(kobject_get(&k->kobj)) : NULL;
  173. }
  174.  
  175. static inline void kset_put(struct kset *k)
  176. {
  177.     kobject_put(&k->kobj);
  178. }
  179.  
  180. static inline struct kobj_type *get_ktype(struct kobject *kobj)
  181. {
  182.     return kobj->ktype;
  183. }
  184.  
  185. extern struct kobject *kset_find_obj(struct kset *, const char *);
  186.  
  187. /* The global /sys/kernel/ kobject for people to chain off of */
  188. extern struct kobject *kernel_kobj;
  189. /* The global /sys/kernel/mm/ kobject for people to chain off of */
  190. extern struct kobject *mm_kobj;
  191. /* The global /sys/hypervisor/ kobject for people to chain off of */
  192. extern struct kobject *hypervisor_kobj;
  193. /* The global /sys/power/ kobject for people to chain off of */
  194. extern struct kobject *power_kobj;
  195. /* The global /sys/firmware/ kobject for people to chain off of */
  196. extern struct kobject *firmware_kobj;
  197.  
  198. #if defined(CONFIG_HOTPLUG)
  199. int kobject_uevent(struct kobject *kobj, enum kobject_action action);
  200. int kobject_uevent_env(struct kobject *kobj, enum kobject_action action,
  201.             char *envp[]);
  202.  
  203. int add_uevent_var(struct kobj_uevent_env *env, const char *format, ...)
  204.     __attribute__((format (printf, 2, 3)));
  205.  
  206. int kobject_action_type(const char *buf, size_t count,
  207.             enum kobject_action *type);
  208. #else
  209. static inline int kobject_uevent(struct kobject *kobj,
  210.                  enum kobject_action action)
  211. { return 0; }
  212. static inline int kobject_uevent_env(struct kobject *kobj,
  213.                       enum kobject_action action,
  214.                       char *envp[])
  215. { return 0; }
  216.  
  217. static inline int add_uevent_var(struct kobj_uevent_env *env,
  218.                  const char *format, ...)
  219. { return 0; }
  220.  
  221. static inline int kobject_action_type(const char *buf, size_t count,
  222.                       enum kobject_action *type)
  223. { return -EINVAL; }
  224. #endif
  225.  
  226. #endif /* _KOBJECT_H_ */
  227.